查看原文
其他

数据呈现丨R与Office珠联璧合:如何实现R制图便捷导入PPT?

数据Seminar 2021-06-03

The following article is from R语言 Author jamieDee

笔者邀请您,先思考:

如何使用ggplot2包生成可以公开的高质量图形?

最近我面临以下的问题:创建数以百计的图片以便我们的客户仍旧可以编辑。这意味着我需要把图表导出到Excel、PPT或者其它客户熟悉的工具,而不是像往常那样把图片直接以pdf或者png形式导出。尽管我还是希望使用R解决这个问题,因为我可以进行一直以来的操作,当我需要完成重复性任务时,比如生成上百张图,就像一系列国家的地图,并且每个国家单独制作一张。这是我在前一篇博客里面讨论的内容, Make ggplot2 purrr.
因此,经过上网搜寻,我发现了{officer}包,这个包允许你把对象放在Microsoft文件中。比如,可编辑图放在ppt文件中。这就是我将要在这篇博客中展示的。
先从装载需要的包开始:
library("tidyverse")library("officer")library("rvg")
左右滑动查看更多
然后,我将使用“时间使用”调查的数据,这数据我在前一篇博客中Going from a human readable Excel file to a machine-readable csv with {tidyxl}(翻译)有讨论。
你可以在这里下载数据。
让我们导入并且预处理数据吧!
time_use <- rio::import("clean_data.csv")

time_use <- time_use %>% filter(population %in% c("Male", "Female")) %>% filter(activities %in% c("Personal care", "Sleep", "Eating", "Employment", "Household and family care")) %>% group_by(day) %>% nest()
左右滑动查看更多

我只保留了两类:“Male”和“Female”,以及5项活动。接着按照day分组并把其余的nested在data中。以下就是呈现的状况:

time_use## # A tibble: 3 x 2## day data ## <chr> <list> ## 1 Year 2014_Monday til Friday <tibble [10 × 4]>## 2 Year 2014_Saturday <tibble [10 × 4]>## 3 Year 2014_Sunday <tibble [10 × 4]>
左右滑动查看更多

正如展现的那样,'time_use'是一个有两列的tibble,第一列'day'包含了days,第二列'data'是一个类型列,并且列中的每个元素是自身的tibbles。让我们看看其中一个的内容:

time_use$data[1] ## [[1]] ## # A tibble: 10 x 4 ## population activities time time_in_minutes ## <chr> <chr> <chr> <int> ## 1 Male Personal care 11:00 660 ## 2 Male Sleep 08:24 504 ## 3 Male Eating 01:46 106 ## 4 Male Employment 08:11 491 ## 5 Male Household and family care 01:59 119 ## 6 Female Personal care 11:15 675 ## 7 Female Sleep 08:27 507 ## 8 Female Eating 01:48 108 ## 9 Female Employment 06:54 414 ## 10 Female Household and family care 03:49 229
左右滑动查看更多

现在可以使用以下的代码为每一天绘制图了:

my_plots <- time_use %>% mutate(plots = map2(.y = day, .x = data, ~ggplot(data = .x) + theme_minimal() + geom_col(aes(y = time_in_minutes, x = activities, fill = population), position = "dodge") + ggtitle(.y) + ylab("Time in minutes") + xlab("Activities")))
左右滑动查看更多
这些步骤在之前的博客中 Make ggplot2 purrr都很详细。查看my_plots:
my_plots## # A tibble: 3 x 3## day data plots ## <chr> <list> <list> ## 1 Year 2014_Monday til Friday <tibble [10 × 4]> <S3: gg>## 2 Year 2014_Saturday <tibble [10 × 4]> <S3: gg>## 3 Year 2014_Sunday <tibble [10 × 4]> <S3: gg>
左右滑动查看更多
最后一列plots是一个列,其中每个元素都是一张图!我们可以看看其中一个:
my_plots$plots[1]## [[1]]
左右滑动查看更多


这就是我可以导出为pdf或者png形式的图像。但这不是我想要的,我需要把这些图像导出为ppt可操作的图表。对于每一个图像,我会采用以下操作(包含每个{officer}的文件):
read_pptx() %>% add_slide(layout = "Title and Content", master = "Office Theme") %>% ph_with_vg(code = print(one_plot), type = "body") %>% print(target = path)

左右滑动查看更多

我写了一个包装把一系列的参数结合起来:

create_pptx <- function(plot, path){ if(!file.exists(path)) { out <- read_pptx() } else { out <- read_pptx(path) } out %>% add_slide(layout = "Title and Content", master = "Office Theme") %>% ph_with_vg(code = print(plot), type = "body") %>% print(target = path) }
左右滑动查看更多
该函数有两个参数:plot以及path。plot必须是一个plot对象,就像my_plots里面的plots列包含的plot对象那样。path是我想要保存pptx的路径。
第一行检查文件是否存在,如果是,slides就会添加到存在的文件中,如果不是,一个新的pptx被创建。其余的代码跟文件里面的非常相似。现在,为了创建我的pptx,我只需要把plots列匹配好并且提供一个path:
map(my_plots$plots, create_pptx, path = "test.pptx")## [[1]]## [1] "/home/cbrunos/Documents/b-rodrigues.github.com/content/blog/test.pptx"## ## [[2]]## [1] "/home/cbrunos/Documents/b-rodrigues.github.com/content/blog/test.pptx"## ## [[3]]## [1] "/home/cbrunos/Documents/b-rodrigues.github.com/content/blog/test.pptx"
左右滑动查看更多
这是最后的结果:
作者:Bruno Rodrigues
原文链接 :
https://www.brodrigues.co/blog/2018-10-05-ggplot2_purrr_officer/








►一周热文

发布丨2019年年终盘点之转载热门文章TOP10

发布丨2019年年终盘点之原创热门文章TOP10

老姚专栏丨伪相关、FWL定理与偏相关系数

统计计量丨政策效应评估的四种主流方法(Policy evaluation)

数据呈现丨R语言:逻辑回归模型可视化分析

统计计量丨双重差分法的平行趋势假定















数据Seminar




这里是大数据、分析技术与学术研究的三叉路口




作者:JamieDee出处:R语言推荐:简华(何年华)编辑:青酱






    欢迎扫描👇二维码添加关注    


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存